﻿// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动！任何基于本项目二次开发而产生的一切法律纠纷和责任，我们不承担任何责任！

using Admin.NET.Plugin.Easy.Wms.Enum;
using Admin.NET.Plugin.Easy.Wms.IServices.ISku;
using Admin.NET.Plugin.Easy.Wms.Services.Sku.DTO;
using Admin.NET.Plugin.Easy.Wms.Util;
using Furion.FriendlyException;
using Mapster;

namespace Admin.NET.Plugin.Easy.Wms.Services.Sku;
public class SkuServices : BaseService.BaseServices<Easy_Wms_SkuEntity>, ISkuServices
{
    private readonly SqlSugarRepository<Easy_Wms_SkuEntity> _sku = App.GetService<SqlSugarRepository<Easy_Wms_SkuEntity>>();


    /// <summary>
    /// 添加物料信息业务逻辑
    /// </summary>
    /// <param name="input">添加参数</param>
    /// <returns></returns>
    public async Task Add(SkuAddInput input)
    {
        input.Sku_Num = input.Sku_Num.GenerateIfNullOrEmpty(() => GenerateNum.GeneratedNumber("SKU"));
        var entity = input.Adapt<Easy_Wms_SkuEntity>();
        await _sku.InsertAsync(entity);
    }

    /// <summary>
    /// 删除物料信息业务逻辑
    /// </summary>
    /// <param name="input">id</param>
    /// <returns></returns>
    /// TODO：没有添加校验
    public async Task Delete(SkuDeleteInput input)
    {
        // 判断能否删除，如果库存中有物料，则不能删除
        var entity = await _sku.GetFirstAsync(x => x.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
        await _sku.FakeDeleteAsync(entity);
    }

    /// <summary>
    /// 分页查询物料信息
    /// </summary>
    /// <param name="input">查询参数</param>
    /// <returns></returns>
    public async Task<SqlSugarPagedList<SkuOutPut>> PageAsync(SkuPageInput input)
    {
        var data = _sku.AsQueryable()
             .WhereIF(!string.IsNullOrEmpty(input.Sku_Name), x => x.Sku_Name.Contains(input.Sku_Name))
             .WhereIF(!string.IsNullOrEmpty(input.Sku_Num), x => x.Sku_Num.Contains(input.Sku_Num))
             .WhereIF(!string.IsNullOrEmpty(input.Sku_Type), x => x.Sku_Type.Contains(input.Sku_Type))
             .WhereIF(!string.IsNullOrEmpty(input.Sku_Source), x => x.Sku_Source.Contains(input.Sku_Source))
             .Select<SkuOutPut>();

        return await data.ToPagedListAsync(input.Page, input.PageSize);
    }

    /// <summary>
    /// 修改物料信息
    /// </summary>
    /// <param name="input">修改参数</param>
    /// <returns></returns>
    public async Task Update(SkuUpdateInput input)
    {
        var model = input.Adapt<Easy_Wms_SkuEntity>();
        model.UpdateTime = DateTime.Now;
        await _sku.AsUpdateable(model).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
    }
}
